#include <stdio.h>
#include <time.h>

// 检查日期有效性
int is_valid_date(int year, int month, int day) {
    if (year < 1900 || year > 2100) return 0;
    if (month < 1 || month > 12) return 0;

    // 月份天数表（平年）
    static const int days_in_month[12] =
        {31,28,31,30,31,30,31,31,30,31,30,31};

    int dim = days_in_month[month - 1];

    // 判断闰年2月
    if (month == 2) {
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
            dim = 29;
    }

    if (day < 1 || day > dim) return 0;

    return 1;
}

// 计算两日期间天数差，返回绝对值
int diff_days(int y1, int m1, int d1, int y2, int m2, int d2) {
    struct tm tm1 = {0}, tm2 = {0};

    tm1.tm_year = y1 - 1900;
    tm1.tm_mon = m1 - 1;
    tm1.tm_mday = d1;

    tm2.tm_year = y2 - 1900;
    tm2.tm_mon = m2 - 1;
    tm2.tm_mday = d2;

    time_t time1 = mktime(&tm1);
    time_t time2 = mktime(&tm2);

    if (time1 == (time_t)(-1) || time2 == (time_t)(-1)) {
        return -1; // 无效时间戳
    }

    double diff_sec = difftime(time2, time1);
    int diff_day = (int)(diff_sec / (60 * 60 * 24));
    if (diff_day < 0) diff_day = -diff_day;

    return diff_day;
}

void diffdays_6() {
    int y1, m1, d1, y2, m2, d2;

    printf("请输入第一个日期 (年 月 日): ");
    if (scanf("%d %d %d", &y1, &m1, &d1) != 3) {
        printf("输入格式错误。\n");
        return;
    }

    if (!is_valid_date(y1, m1, d1)) {
        printf("第一个日期无效。\n");
        return;
    }

    printf("请输入第二个日期 (年 月 日): ");
    if (scanf("%d %d %d", &y2, &m2, &d2) != 3) {
        printf("输入格式错误。\n");
        return;
    }

    if (!is_valid_date(y2, m2, d2)) {
        printf("第二个日期无效。\n");
        return;
    }

    int diff = diff_days(y1, m1, d1, y2, m2, d2);
    if (diff == -1) {
        printf("日期计算出错。\n");
    } else {
        printf("日期 %d-%02d-%02d 与 %d-%02d-%02d 相差 %d 天。\n",
               y1, m1, d1, y2, m2, d2, diff);
    }
}
